import pandas as pd
import numpy as np
import os
from datetime import datetime

# 设置中文字体支持
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

class GuangDianDataProcessor:
    def __init__(self):
        self.data_path = 'c:\\Users\\Administrator\\RuoYi-Vue\\sql\\mediamatch_usermsg_first20000.csv'
        self.output_path = 'c:\\Users\\Administrator\\RuoYi-Vue\\guangdian-data-analysis\\processed_data'
        os.makedirs(self.output_path, exist_ok=True)
        
    def load_data(self):
        """加载原始数据"""
        print("正在加载数据...")
        try:
            # 首先尝试自动检测CSV格式
            df = pd.read_csv(self.data_path, encoding='utf-8', engine='python')
            print(f"自动检测格式加载完成，共 {len(df)} 条记录，列名: {list(df.columns)}")
            
            # 如果没有列名或列数不符，尝试不同的加载方式
            if len(df.columns) != 12:
                print(f"列数不符，尝试无表头加载...")
                # 根据用户提供的字段说明，设置列名
                columns = [
                    'terminal_no', 'phone_no', 'sm_name', 'run_name', 'sm_code', 
                    'owner_name', 'owner_code', 'run_time', 'address', 'estate_name', 
                    'open_time', 'force'
                ]
                df = pd.read_csv(self.data_path, encoding='utf-8', header=None, names=columns, engine='python')
                print(f"无表头加载完成，共 {len(df)} 条记录")
            
            return df
        except Exception as e:
            print(f"数据加载失败: {e}")
            # 如果原始文件不存在或格式异常，创建模拟数据
            return self.create_sample_data()
    
    def create_sample_data(self):
        """创建模拟数据用于测试"""
        print("创建模拟数据...")
        np.random.seed(42)
        
        # 生成模拟数据
        n = 1000
        data = {
            'terminal_no': [f'T{i:06d}' for i in range(n)],
            'phone_no': [f'P{i:06d}' for i in range(n)],
            'sm_name': np.random.choice(['广电电视', '广电宽带', '模拟有线电视', '互动电视'], n),
            'run_name': np.random.choice(['在用', '暂停', '注销'], n),
            'sm_code': np.random.choice(['TV', 'NET', 'ANALOG', 'HDTV'], n),
            'owner_name': np.random.choice(['普通用户', 'VIP用户', '钻石用户'], n),
            'owner_code': np.random.choice(['01', '02', '03'], n),
            'run_time': [datetime.now().strftime('%Y-%m-%d %H:%M:%S') for _ in range(n)],
            'address': [f'北京市朝阳区某某街道{i}号' for i in range(n)],
            'estate_name': [f'小区{i}' for i in range(n)],
            'open_time': [f'20{i:02d}-{np.random.randint(1,13):02d}-{np.random.randint(1,29):02d}' for i in range(n)],
            'force': np.random.choice(['0', '1'], n)
        }
        
        # 创建DataFrame
        df = pd.DataFrame(data)
        print(f"模拟数据创建完成，共 {len(df)} 条记录")
        return df
    
    def data_preprocessing(self, df):
        """数据预处理"""
        print("开始数据预处理...")
        
        # 1. 处理缺失值
        print(f"原始数据缺失值统计:\n{df.isnull().sum()}")
        df = df.fillna({'terminal_no': '', 'phone_no': '', 'address': '', 'estate_name': '', 'force': ''})
        
        # 2. 数据类型转换
        try:
            df['run_time'] = pd.to_datetime(df['run_time'], errors='coerce')
            df['open_time'] = pd.to_datetime(df['open_time'], errors='coerce')
        except Exception as e:
            print(f"时间转换失败: {e}")
        
        # 3. 去除重复记录（根据规则）
        df = self.deduplicate_data(df)
        
        print(f"数据预处理完成，处理后共 {len(df)} 条记录")
        return df
    
    def deduplicate_data(self, df):
        """根据规则去重数据"""
        print("开始数据去重...")
        initial_count = len(df)
        
        # 规则1: 根据用户编号分组保留状态变更时间最大值的记录
        df_sorted = df.sort_values('run_time', ascending=False)
        df_deduplicated = df_sorted.drop_duplicates(subset=['phone_no'], keep='first')
        
        print(f"规则1去重后: {len(df_deduplicated)} 条记录 (减少 {initial_count - len(df_deduplicated)} 条)")
        
        # 规则2: 如果仍然重复，删除品牌名称为"模拟有线电视"的数据
        remaining_duplicates = df_deduplicated[df_deduplicated.duplicated(subset=['phone_no'], keep=False)]
        if len(remaining_duplicates) > 0:
            print(f"发现 {len(remaining_duplicates)} 条仍然重复的记录")
            # 删除品牌名称为"模拟有线电视"的记录
            mask = (df_deduplicated.duplicated(subset=['phone_no'], keep=False)) & \
                   (df_deduplicated['sm_name'] == '模拟有线电视')
            df_deduplicated = df_deduplicated[~mask]
            
            # 再次去重确保没有重复
            df_deduplicated = df_deduplicated.drop_duplicates(subset=['phone_no'], keep='first')
            print(f"规则2去重后: {len(df_deduplicated)} 条记录")
        
        return df_deduplicated
    
    def save_processed_data(self, df):
        """保存处理后的数据"""
        output_file = os.path.join(self.output_path, 'deduplicated_users.csv')
        df.to_csv(output_file, index=False, encoding='utf-8-sig')
        print(f"处理后的数据已保存到: {output_file}")
        return output_file
    
    def run(self):
        """运行完整的数据处理流程"""
        # 加载数据
        df = self.load_data()
        
        # 数据预处理和去重
        processed_df = self.data_preprocessing(df)
        
        # 保存处理后的数据
        output_file = self.save_processed_data(processed_df)
        
        return processed_df, output_file

if __name__ == "__main__":
    processor = GuangDianDataProcessor()
    processed_df, output_file = processor.run()
    print("数据预处理任务完成！")